package com.ys.day29.Reflect.p1Class加载器的了解与使用;

/**
 * 描述: Reflect 反射
 *  案列1
 *  获取某个字节码文件的类加载器以及它父加载器的名称。
 *
 * 步骤：1 获取字节码文件在内存中的Class对象
 *
 * ​	    2 获取Class对象的类加载器
 *
 * ​	    3 获取类加载器的父类加载器
 *
 * @author CodeYang
 * @version 2021/1/9 21:23
 */
public class Reflect反射的加载顺序 {

    public static void main(String[] args) {
        // 1 获取字节码文件在内存中的Class对象
        //注意：每个字节码文件在内存中都有自己唯一的一个Class对象
        // 方式1   Class<ReflectTest01> reflectTest01Class = ReflectTest01.class;
        Class<Reflect反射的加载顺序> aClass = Reflect反射的加载顺序.class;
        // 打印: class com.ys.day29.ReflectTest01  class 类对象在 元空间 中的名称
        System.out.println(aClass);
        // 2 : 获得 aClass 的 类加载器
        // 获得 当前字节码文件的类加载器是哪一个 类加载器
        ClassLoader classLoader = aClass.getClassLoader();
        // sun.misc.Launcher$AppClassLoader@18b4aac2  此时我们的文件是在 java的 out.项目工程下 是由 AppClassLoader 加载器 加载的
        System.out.println(classLoader);

        // 3:获得  classLoader 的父类 类加载器
        ClassLoader parentClass = classLoader.getParent();
        // sun.misc.Launcher$ExtClassLoader@1b6d3586   此时可以发现 classLoader 的父类的加载器是 ExtClassLoader
        System.out.println(parentClass);

        //4 : 获得 parentClass 的 父类的 类加载器
        ClassLoader TopParentClass = parentClass.getParent();
        // 输出 null 因为此时的最高加载器 因为BootStrapLoader是由C和C++编写的此时看不到 
        System.out.println(TopParentClass);



    }
}
